package cn.xyfmzmy.facade.spring;

import cn.xyfmzmy.plugin.MyPlugin;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@RestController
public class TimeController {

    // 自定义插件
    private MyPlugin myPlugin;

    private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @GetMapping("/time")
    public String getTime(){
        // 支持自定义插件
        if(myPlugin != null){
            myPlugin.beforeGetTime();
        }
        return LocalDateTime.now().format(dateTimeFormatter);
    }

    // 约定：实现了自定义插件的jar包，必须拥有一个叫 xyfmzmy.plugin 的文件,这个文件的内容就是实现了myPlugin的全类名
    @GetMapping("/loadPlugin/{path}")
    public String loadPlugin(@PathVariable("path") String path){
        try{
            // 根据相对路径创建jar包的类加载器
            File file = new File(path);
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{file.toPath().toUri().toURL()});
            // 获取jar包中resources下的文件，文件中记录着实现了myPlugind的全类名
            InputStream xyfmzmyFile = urlClassLoader.getResourceAsStream("xyfmzmy.plugin");
            String myPluginFullClassName = new String(xyfmzmyFile.readAllBytes());
            // 根据全类名获取对应的Class,创建对象并赋值
            Class<?> aClass = urlClassLoader.loadClass(myPluginFullClassName);
            Constructor<?> constructor = aClass.getConstructor();
            myPlugin = (MyPlugin) constructor.newInstance();
            return "加载成功" + aClass.getName();
        }catch (Exception e){
            return "加载失败";
        }
    }
}
